package cn.itcast.job;

import com.dangdang.ddframe.job.api.ShardingContext;
import com.dangdang.ddframe.job.api.dataflow.DataflowJob;
import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.List;

/**
 * @program: schedule
 * @description: DataFlowJob类型的任务
 * @author: zhanghz001
 * @create: 2021-08-04 20:55
 **/
@Slf4j
public class ZhzDataflowJob implements DataflowJob<Integer> {
    //偶数
    private static List<Integer> dataEvent = new ArrayList<>();
    //奇数
    private static List<Integer> dataOld = new ArrayList<>();
    
    static {
        for (int i = 0; i < 10000; i++) {
            if (i % 2 == 0) {
                dataEvent.add(i);
            } else {
                dataOld.add(i);
            }
        }
    }
    
    /**
     * 过滤需要执行的数据
     * 需求：某个任务需要处理10000个数据，需要将任务分为2个分片来处理，
     * 第一个分片处理偶数，
     * 第二个分片处理奇数。
     * 每个分片每次抓取100个数据进行处理,直到处理完毕；
     *
     * @param shardingContext
     * @return
     */
    @Override
    public List<Integer> fetchData(ShardingContext shardingContext) {
        
        //
        List<Integer> integers = null;
        
        //根据分片来实现数据分离
        if (shardingContext.getShardingItem() == 0) {
            //0号分片
            if (dataEvent.size() > 100) {
                //每次最多取100个
                integers = dataEvent.subList(0, 100);
            } else {
                integers = dataEvent;
            }
        } else {
            //1号分片和其他分片
            if (dataOld.size() > 100) {
                //每次最多取100
                integers = dataOld.subList(0, 100);
            } else {
                integers = dataOld;
            }
        }
        
        return integers;
    }
    
    @Override
    public void processData(ShardingContext shardingContext, List<Integer> list) {
        log.info("当前分片为: {} ,需要消费的队列: {}", shardingContext.getShardingItem(), list);
        if (shardingContext.getShardingItem() == 0) {
            //0号分片直接删除
            dataEvent.removeAll(list);
        } else {
            //1号分片也删除
            dataOld.removeAll(list);
        }
    }
}
